<?php

namespace Nece\Sdk\Coze\Api;

use Nece\Sdk\Coze\ApiAbstract;

/**
 * 空间与智能体
 *
 * @author gjw
 * @created 2025-04-23 14:01:00
 */
class Bot extends ApiAbstract
{
    /**
     * 创建智能体
     * 文档：https://www.coze.cn/open/docs/developer_guides/create_bot
     *
     * @author gjw
     * @created 2025-04-23 13:46:22
     *
     * @param string $space_id 智能体所在的空间的 Space ID。Space ID 是空间的唯一标识。
     * @param string $name 智能体的名称。长度为 1~ 20 个字符。
     * @param string $description 智能体的描述信息。长度为 0~ 500 个字符。默认为空。
     * @param string $icon_file_id 作为智能体头像的文件 ID。
     * @param array $prompt_info 智能体的人设与回复逻辑。https://www.coze.cn/open/docs/developer_guides/create_bot#promptinfo
     * @param array $onboarding_info 智能体的开场白相关设置。https://www.coze.cn/open/docs/developer_guides/create_bot#onboardinginfo
     * @param array $plugin_id_list 智能体的插件配置。https://www.coze.cn/open/docs/developer_guides/create_bot#pluginidlist
     * @param array $workflow_id_list 智能体绑定的工作流 ID 列表，用于配置智能体关联的工作流。https://www.coze.cn/open/docs/developer_guides/create_bot#workflowidlist
     * @param array $model_info_config 智能体的模型配置，用于指定智能体绑定的模型 ID 及相关参数。不同模型支持的配置参数及取值范围各不相同，可在扣子平台的模型列表中查看具体参数及取值范围。 https://www.coze.cn/open/docs/developer_guides/create_bot#modelinfoconfig
     * @param array $suggest_reply_info 配置智能体回复后是否提供用户问题建议。 https://www.coze.cn/open/docs/developer_guides/create_bot#suggestreplyinfo
     * @return array
     */
    public function create(string $space_id, string $name, string $description = '', string $icon_file_id = '', array $prompt_info = [], array $onboarding_info = [], array $plugin_id_list = [], array $workflow_id_list = [], array $model_info_config = [], array $suggest_reply_info = [])
    {
        $api = '/v1/bot/create';

        $params = array(
            'space_id' => $space_id,
            'name' => $name
        );

        if (!empty($description)) {
            $params['description'] = $description;
        }

        if (!empty($icon_file_id)) {
            $params['icon_file_id'] = $icon_file_id;
        }

        if (!empty($prompt_info)) {
            $params['prompt_info'] = $prompt_info;
        }

        if (!empty($onboarding_info)) {
            $params['onboarding_info'] = $onboarding_info;
        }

        if (!empty($plugin_id_list)) {
            $params['plugin_id_list'] = $plugin_id_list;
        }

        if (!empty($workflow_id_list)) {
            $params['workflow_id_list'] = $workflow_id_list;
        }

        if (!empty($model_info_config)) {
            $params['onboarding_info'] = $model_info_config;
        }

        return $this->post($api, $params);
    }

    /**
     * 更新智能体
     * 文档：https://www.coze.cn/open/docs/developer_guides/update_bot
     *
     * @author gjw
     * @created 2025-04-23 13:50:15
     *
     * @param string $bot_id 待修改配置的智能体 ID。
     * @param string $name 智能体的名称。长度为 1~ 20 个字符。
     * @param string $description 智能体的描述信息。长度为 0~ 500 个字符。默认为空。
     * @param string $icon_file_id 作为智能体头像的文件 ID。
     * @param array $prompt_info 智能体的人设与回复逻辑。
     * @param array $onboarding_info 智能体的开场白相关设置。
     * @param array $knowledge 智能体的知识库配置。
     * @param array $plugin_id_list 智能体的插件配置列表，用于绑定插件及其工具。
     * @param array $workflow_id_list 智能体绑定的工作流 ID 列表，用于配置智能体的工作流。
     * @param array $model_info_config 智能体的模型配置，用于指定智能体使用的模型及其相关参数。
     * @param array $suggest_reply_info 配置智能体回复后的用户问题建议功能。
     * @return array
     */
    public function update(string $bot_id, string $name = '', string $description = '', string $icon_file_id = '', array $prompt_info = [], array $onboarding_info = [], array $knowledge = [], array $plugin_id_list = [], array $workflow_id_list = [], array $model_info_config = [], array $suggest_reply_info = [])
    {
        $api = '/v1/bot/update';

        $params = array(
            'bot_id' => $bot_id,
        );

        if ($name) {
            $params['name'] = $name;
        }

        if (!empty($description)) {
            $params['description'] = $description;
        }

        if (!empty($icon_file_id)) {
            $params['icon_file_id'] = $icon_file_id;
        }

        if (!empty($prompt_info)) {
            $params['prompt_info'] = $prompt_info;
        }

        if (!empty($onboarding_info)) {
            $params['onboarding_info'] = $onboarding_info;
        }

        if (!empty($knowledge)) {
            $params['knowledge'] = $knowledge;
        }

        if (!empty($plugin_id_list)) {
            $params['plugin_id_list'] = $plugin_id_list;
        }

        if (!empty($workflow_id_list)) {
            $params['workflow_id_list'] = $workflow_id_list;
        }

        if (!empty($model_info_config)) {
            $params['onboarding_info'] = $model_info_config;
        }

        if (!empty($suggest_reply_info)) {
            $params['suggest_reply_info'] = $suggest_reply_info;
        }

        return $this->post($api, $params);
    }

    /**
     * 发布智能体
     *
     * @author gjw
     * @created 2025-04-23 13:53:08
     *
     * @param string $bot_id 要发布的智能体 ID。
     * @param array $connector_ids 智能体的发布渠道 ID 列表。目前支持通过此 API 将智能体发布为 API、Chat SDK 以及自定义渠道。
     * @return array
     */
    public function publish(string $bot_id, array $connector_ids)
    {
        $api = '/v1/bot/publish';

        $params = array(
            'bot_id' => $bot_id,
            'connector_ids' => $connector_ids
        );
        return $this->post($api, $params);
    }

    /**
     * 查看智能体列表
     *
     * @author gjw
     * @created 2025-04-23 13:56:24
     *
     * @param string $workspace_id 智能体所在的工作空间的 Space ID。
     * @param integer $page_num 分页查询时的页码。默认为 1，即从第一页数据开始返回。
     * @param integer $page_size 分页大小。默认为 20，即每页返回 20 条数据。
     * @param string $connector_id 渠道 ID，仅在智能体发布状态为 published_online 或 published_draft 时需要设置。用于筛选指定渠道下已发布的智能体版本，包括线上正式版本和草稿版本。默认值为 1024，表示获取 API 发布渠道下的最新版本。
     * @param string $publish_status 智能体的发布状态，用于筛选不同发布状态的智能体。枚举值如下： all ：所有状态。 published_online ：（默认值）已发布的正式版。  published_draft ：已发布但当前为草稿状态。  unpublished_draft ：从未发布过。
     * @return array
     */
    public function list(string $workspace_id, int $page_num = 1, int $page_size = 10, string $connector_id = '', string $publish_status = 'published_online')
    {
        $api = '/v1/bots';
        $query = array(
            'workspace_id' => $workspace_id,
            'page_num' => $page_num,
            'page_size' => $page_size,
            'publish_status' => $publish_status,
        );

        if ($connector_id) {
            $query['connector_id'] = $connector_id;
        }

        return $this->get($api, $query);
    }

    /**
     * 获取智能体配置
     *
     * @author gjw
     * @created 2025-04-23 13:58:07
     *
     * @param string $bot_id 要查看的智能体 ID。
     * @return array
     */
    public function getMedata(string $bot_id)
    {
        $api = '/v1/bots/:bot_id';
        $api = str_replace(':bot_id', $bot_id, $api);
        return $this->get($api);
    }

    /**
     * 下架智能体
     *
     * @author gjw
     * @created 2025-08-05 11:11:47
     *
     * @param string $bot_id 待下架的智能体的 ID。你可通过智能体开发页面 URL 中的 bot 参数获取智能体 ID 。
     * @param string $connector_id 待下架的渠道 ID。
     * @param string $unpublish_reason 下架渠道的原因说明，用于记录或说明为何执行下架操作。最大支持 1024个字符。
     * @return array
     */
    public function disconnectBot(string $bot_id, string $connector_id, string $unpublish_reason = '')
    {
        $api = '/v1/bots/:bot_id/unpublish';
        $api = str_replace(':bot_id', $bot_id, $api);

        $params = array(
            'connector_id' => $connector_id
        );
        if ($unpublish_reason) {
            $params['unpublish_reason'] = $unpublish_reason;
        }

        return $this->post($api, $params);
    }

    /**
     * 查看应用列表
     *
     * @author gjw
     * @created 2025-08-05 11:14:37
     *
     * @param string $workspace_id 扣子应用所在的工作空间的 Space ID。Space ID 是工作空间的唯一标识。
     * @param integer $page_num 分页查询时的页码。默认为 1，即从第一页数据开始返回。
     * @param integer $page_size 分页大小。默认为 20，即每页返回 20 条数据。
     * @param string $connector_id 渠道 ID，仅在 publish_status 为 published_online 或 published_draft 时需要设置。用于筛选该渠道下已发布的扣子应用，包括已发布的线上正式版本和已发布的草稿版本。默认值为 1024，即默认获取 API 发布渠道下的最新版本。
     * @param string $publish_status扣子应用的发布状态，用于筛选不同发布状态的扣子应用。枚举值如下： all ：所有状态。 published_online ：（默认值）已发布的正式版。 published_draft ：已发布但当前为草稿状态。 unpublished_draft ：从未发布过。
     * @return array
     */
    public function listApp(string $workspace_id, int $page_num = 1, int $page_size = 10, string $connector_id = '', string $publish_status = 'published_online')
    {
        $api = '/v1/apps';
        $query = array(
            'workspace_id' => $workspace_id,
            'page_num' => $page_num,
            'page_size' => $page_size,
            'publish_status' => $publish_status,
        );
        if ($connector_id) {
            $query['connector_id'] = $connector_id;
        }
        return $this->get($api, $query);
    }

    /**
     * 查看空间列表
     *
     * @author gjw
     * @created 2025-08-05 11:18:34
     *
     * @param integer $page_num 分页查询时的页码。默认为 1，即从第一页数据开始返回
     * @param integer $page_size 分页大小。默认为 20，最大为 50
     * @param string $enterprise_id 企业 ID
     * @param string $user_id 扣子用户 ID，用于查询特定用户的工作空间信息。
     * @param string $coze_account_id 扣子的组织 ID，用于查询特定组织的工作空间信息。
     * @return array
     */
    public function workspaces(int $page_num = 1, int $page_size = 10, string $enterprise_id = '', string $user_id = '', string $coze_account_id = '')
    {
        $api = '/v1/workspaces';
        $query = array(
            'page_num' => $page_num,
            'page_size' => $page_size
        );
        if ($enterprise_id) {
            $query['enterprise_id'] = $enterprise_id;
        }
        if ($user_id) {
            $query['user_id'] = $user_id;
        }
        if ($coze_account_id) {
            $query['coze_account_id'] = $coze_account_id;
        }

        return $this->get($api, $query);
    }
}
